package loader;

import nivel.*;
import java.io.*;
import java.net.URL;
import juego.Juego;
import obstaculo.*;

/**
 * Implementacion de un creador de niveles por archivos.
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */
public class CreatorByFile extends Creator {

	/** el nivel. */
	private Nivel nivel;

	/**
	 * Constructor de un creador por archivos
	 * 
	 * @param s
	 *            ruta del archivo contenedor del nivel
	 * @param j
	 *            el juego que se le asociara al nivel
	 */
	public CreatorByFile(String s, Juego j) {
		nivel = new Nivel(j);
		URL rutaArchivo = getClass().getResource(s);
		InputStreamReader input;
		try {
			input = new InputStreamReader(rutaArchivo.openStream());
			procesarArchivo(input);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/**
	 * Retorna el nivel generado.
	 * 
	 * @return nivel - nivel generado
	 */
	@Override
	public Nivel getNivel() {
		return nivel;
	}

	/**
	 * Metodo utilizado para procesar el archivo.
	 * 
	 * @param input
	 *            stream de entrada
	 */
	protected void procesarArchivo(InputStreamReader input) {

		try {
			BufferedReader in = new BufferedReader(input);
			String str;
			while ((str = in.readLine()) != null) {
				this.procesarLinea(str);
			}
			in.close();
		} catch (IOException e) {
		}
	}

	/**
	 * Procesa una linea del archivo. Se encarga de ingresar los casilleros al
	 * tablero y al panel de componentes.
	 * 
	 * @param str
	 *            - linea a procesar
	 */
	protected void procesarLinea(String str) {
		int x, y;
		char o;
		int aux;

		if (str != null) {

			aux = str.indexOf(',');
			x = Integer.parseInt(str.substring(0, aux));
			y = Integer.parseInt(str.substring(aux + 1, str.lastIndexOf(',')));
			o = str.charAt(str.lastIndexOf(',') + 1);

			Casillero ca = inicializarCasillero(x, y, o);
			nivel.getTablero().agregarAlTablero(ca);
			nivel.getGrafica().getPanelComponentes().agregarObstaculo(ca);

		}

	}

	/**
	 * Creacion e inicializacion de un casillero con sus coordenadas y obstaculo
	 * asociado.
	 * 
	 * 
	 * @param x
	 *            posicion en el eje x
	 * @param y
	 *            posicion en el eje y
	 * @param c
	 *            caracter que representa el obstaculo asociado
	 * @return el nuevo casillero.
	 */
	private Casillero inicializarCasillero(int x, int y, char c) {
		Obstaculo o;
		Casillero ca = new Casillero(x, y);

		switch (c) {
		case 'A':
			o = new Abismo(ca);
			break;
		case 'B':
			o = new Bloque(ca);
			break;
		case 'L':
			o = new Ladrillo(ca);
			break;
		default:
			o = null;
			break;
		}

		ca.setObstaculo(o);

		return ca;
	}

}
